package main.chapter3

private abstract class A {
    var i = 0
    open fun helloA() {
        println(i)
    }

    //抽象方法，继承的子类需要实现该方法
    abstract fun helloA1()
}

interface B {
    var j: Int
    fun helloB() {
        //Kotlin接口中方法可以有默认实现的方法体，
        //如果有默认实现的方法，实现该接口就可以选择不复写该方法
        println(j)
    }

    fun helloB1()
}

interface C

//单继承，多实现
private class D(override var j: Int) : A(), B, C {
    //实现接口中的方法
    override fun helloB1() {
        println("HelloB1")
    }

    //实现抽象方法
    override fun helloA1() {
        println("HelloA1")
    }

    //复写方法
    override fun helloA() {
        println("HelloA")
    }
}

//抽象类与接口的设计思路，一般将中心词作为抽象类，中心词前面的修饰作为接口
//比如：<小米><笔记本>电脑

fun main(args: Array<String>) {
    val d = D(1)

}